#include<stdio.h>
#include<stdlib.h>

struct LNode
{
	int data;
	struct LNode *next;
};
struct LNode *CreateListT(struct LNode * L, int n)
{
	//1.先定义一个节点指针s指向新生结点，先建立一个头结点
	struct LNode *s;
	L=(struct LNode *)malloc(sizeof(struct LNode));
	L->next=NULL;
	//2循环输入数据,生成新的结点,每个新生节点加入到头结点后。
	//数据域赋值，指针域更换
	int data;
	while(n)
	{
		scanf("%d",&data);
		s=(struct LNode *)malloc(sizeof(struct LNode));
		s->data=data;
		s->next=L->next;
		L->next=s;
		n--;
	}
	return L;
}

//带头结点的尾插法创建单链表
struct LNode *CreateListF(struct LNode *L,int n)
{
	//1.先建立一个头结点，r始终指向尾结点开始指向头结点
	struct LNode *r,*s;//s指向新生结点，r指向尾结点
	L=(struct LNode *)malloc(sizeof(struct LNode));
	r=L;
	//2循环输入数据,生成新的结点，数据域赋值，指针域更换
	int data;
	while(n)
	{
		scanf("%d",&data);
		s=(struct LNode *)malloc(sizeof(struct LNode));
		s->data=data;
		r->next=s;
		r=s;
		n--;
	}
	//3.最后尾指针置位空
	r->next=NULL;
	return L;
}

struct LNode *ConnectLinkList(struct LNode * L1,struct LNode *L2)
{
	struct LNode *temp;
	if(L1->next==NULL) return L2;	
	else
	{
		if(L2->next!=NULL)
		{
			temp=L1;
			while(temp->next) temp=temp->next;
			temp->next=L2;
		}
	}
	return L1;
}
void printfList(struct LNode *L)
{
	struct LNode *s=L->next;
	while(s!=NULL)
	{
		printf("%d ",s->data);
		s=s->next;
	}
}
int main()
{
	printf("输入你想创建的两条链表节点数:\n");
	int num1,num2;
	scanf("%d %d",&num1,&num2);
	
	struct LNode *L1;
	struct LNode *L2;
	//创建两条链表
	printf("链表1：");
	L1=CreateListF(L1,num1);
	printf("链表2：");
	L2=CreateListF(L2,num2);
	//打印
	printf("合并前:\n");
	printfList(L1);
	printf("\n---------------------------\n");
	printfList(L2);
	printf("\n");
	
	printf("合并后:\n");
	struct LNode * Conect=ConnectLinkList(L1,L2);
	printfList(Conect);
	printf("\n");
	
	return 0;
}
